package jinzhi1.binary.binary.lib;


// 八进制
public class Oct extends Binary {
    private long oct;
    public Oct(long oct) {
        this.oct = oct;
    }

    /*
    函数：八进制转换二进制
    原理：
       1. 将八进制数字分成一个一组
       2. 对每一组数字进行转换二进制三个数字
       3.将转换后的结果连接起来
        (11)
        1--001   1--001
        二进制为: 0001001
     */
    @Override
    public String toBin() {
        String bin = "";
        String str = String.valueOf(oct);
        String[] oct = {"000", "001", "010", "011", "100", "101", "110", "111"};
        for (int i = 0; i < str.length(); i++) {
            int octalDigit = Character.getNumericValue(str.charAt(i));
            bin += oct[octalDigit];
        }
        return bin;
    }
    /*
    函数：八进制转换十进制
      转换原理：
        1.获取的数字从左到右乘8^n-1叠加算出结果
        // 1011
        // (1*8^3)+ (0*8^2)+(1*8^1)+(1*8^0)
     */
    @Override
    public long toDec() {
        long dec = 0;
        String s = String.valueOf(oct);
        for (int i = 0; i < s.length(); i++) {
            int x = Integer.valueOf(s.substring(i,i+1));
            dec +=x*pingFang(8,s.length()-i-1);
        }
        return dec;
    }

    @Override
    public long toOct() {
        return oct;
    }
    /*
    函数：八进制转换16进制
      转换原理：
        1.8进制转换成10进制或二进制
        2.再转换成16进制
     */
    @Override
    public String toHex() {
        String hex = "";
        long dec2 =toDec();
//        String s = String.valueOf(oct);
//        for (int i = 0; i < s.length(); i++) {
//            int x = Integer.valueOf(s.substring(i,i+1));
//             dec +=x*pingFang(8,s.length()-i-1);
//        }
        while (dec2 > 0) {
            //获取余数
            long yuShu = dec2 % 16;
            //判断余数是否小于10,小于10
            if (yuShu < 10) {
                hex = yuShu + hex;
            }else {
                //大于10
                hex = (char) (yuShu + 55) + hex;
            }
            dec2 = dec2 / 16;
        }
        return hex;
    }

    public long pingFang(long num,int p){
        long result = 1;
        for (int i = 0; i < p; i++) {
            result = result*num;
        }
        return result;
    }
}
